L10: Filtry

linux.edumach.cz


Úvod

Do kategorie filtrů řadíme příkazy (programy), které jako vstup přijímají text a provedou s ním nějaké operace. Pokud neurčíte kam (>), vypíšou ho standardní výstup (monitor). Některé příkazy už známe. Jde zejména o

Všechny (kromě tr) mají jako argument soubor. Pokud ne, stačí jej rourou poslat. Podrobně byly vysvětleny v lekci “Roura”.

⬇️ Pracovní soubory

Budeme používat ty stejné, uvedené v lekci “Roura”. Pokud je nemáte, stáhněte si je a rozbalte.

Příkaz grep

search globally for lines matching the regular expression re, and print them

Příkaz grep v Unixových systémech slouží už od roku 1973 k vyhledávání textových řetězců ve souborech. Umožňuje filtrovat řádky, které obsahují zadaný výraz, a výsledky vypisuje do konzole. Je velmi užitečný pro rychlé nalezení informací v rozsáhlých textových datech a pro zpracování výstupů jiných příkazů v příkazové řádce.

Vybírá a na stdout vypisuje řádky, které odpovídají zadanému vzoru. Standardní syntaxe příkazu je:

grep vzor [soubor]

Bez souboru čte stdin (jako většina ostatních příkazů). Zkuste příkaz:

$ grep pa

a postupně vkládejte slova: „papousek“, „lipan obecny“, „slon indicky“, „salova kopana“, „zelena paprika“… Na stdout pošle grep pouze řádky obsahující vzor „pa“, ostatní odfiltruje (nevypíše na stdout). Vkládání ukončíte Ctrl+D. Vyzkoušejte i pro jiný řetězec a vstup.

Grep má velmi mnoho přepínačů (viz man grep). Užitečné jsou zejména tyto:

Příklady:

Vypíše všechny řádky, které obsahují znak 0:

$ grep 0 cisla

Vypíše všechny řádky, které obsahují řetězec rabbit.

  1. Respektuje velikost znaků
  2. Bez ohledu na velikost znaků
  3. Včetně čísel řádků
$ grep rabbit alice.txt
$ grep -i Rabbit alice.txt
$ grep -n rabbit alice.txt

Projde všechny soubory adresáře /etc včetně podadresářů a vypíše všechny řádky obsahující řetězec linux:

$ grep -nr --color linux /etc

Regulární výrazy a grep

Regulární výraz (regular expression, zkráceně REGEX či REGEXP) je speciální řetězec znaků, který představuje určitý vzor (masku) pro textové řetězce – https://www.regularnivyrazy.info/regularni-vyrazy-zaklady.html

Základní regulární výrazy:

Příklady:

$ grep -nr security /etc
$ grep -nr \.conf$ /etc  2> /dev/null
$ grep -nr [.]conf$ /etc  2> /dev/null

Rourou do grepu

Pomocí roury můžeme grepu posílat libovolný výstup:

$ ls /home | grep 16M 

Více grepů

Pomocí více grepů se filtruje kaskádovitě. Nejprve se vyfiltrují řádky podle vzoru v prvním grepu, a ty se rourou odešlou na vstup druhého grepu, který z nich vyfiltruje řádky podle jeho vzoru:

$ grep Alice alice.txt | grep dancing 
$ ls /home | grep 16M | grep -i ka

grep a hledání v názvech souborů

grep jde s výhodou využít i při hledání jen určitých názvů souborů. Přepínač -R u ls vypisuje i obsah podadresářů (recursive).

ls /etc | grep host 
ls -R /etc | grep host 
ls /etc | grep conf$
ls /etc | grep [.]conf$  

grep versus find

Vyhledá a zobrazí všechny soubory končící na .conf:

$ ls -R /etc 2> /dev/null | grep [.]conf$ 

Vyhledá a zobrazí (včetně cesty) všechny soubory končící na .conf:

$ find /etc -name \*.conf 2> /dev/null 

* … libovolný řetězec znaků. \ před hvězdičkou říká, že to je regulární výraz ne znak hvězdička.

💾 Úkoly

Accounty

Sestavte příkaz, který vypíše všechny uživatelské účty nepatřící studentům. Ty jsou v adresáři /home. Počet řešení vedoucích k výsledku je více.

php.ini

V konfiguračním souboru /etc/php/8.2/apache2/php.ini se nachází veškerá nastavení překladače PHP (cesta k souboru se může mírně lišit - místo 8.2 může být 8.3 nebo vyšší). Pro potřeby úkolu není podstatné, co který řádek nastavuje. Důležité je, že má skoro 2000 řádků – ruční procházení je nemyslitelné. Většina jeho obsahu jsou komentáře. Ty se poznají tak, že řádek začíná znakem ; (středník). Z toho plyne, že aktivní řádek středníkem nezačíná. “Vygrepujte” všechny řádky, které nezačínají středníkem a naopak obsahují znak =. Součástí výstupu budou i čísla řádků.

Předtím doporučuji si soubor php.ini projít ručně stránkovacím příkazem less. Jen pro pro představu, jak jeho obsah vypadá.